package day230419;

/**
 * @author 兴趣使然黄小黄
 * @version 1.0
 * @date 2023/4/20 0:10
 * 不使用四则运算计算两数之和
 */
public class Solution {

    public int Add(int num1,int num2) {
        // 如果不考虑进位, 两数之和为两数的异或
        // 进位可以用两数的按位与运算表示, 向左移动一位即可
        // 如果有进位则需要循环加到结果中
        int res = num1 ^ num2; // 存储结果
        int carry = (num1 & num2) << 1; // 表示两数的进位
        // 有进位就需要循环异或加起来
        while (carry != 0) {
            int temp = res; // 暂存旧值
            res = res ^ carry; // 更新结果
            carry = (temp & carry) << 1; // 更新进位
        }
        return res;
    }
}
